// WindowRight.hpp
// Created by Limou on 24-8-21.
//

#ifndef FRONTEND_WINDOWRIGHT_HPP
#define FRONTEND_WINDOWRIGHT_HPP
#include <QWidget>
#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>
#include "../common/Common.hpp"
#include "../subassembly/MessageShowArea/MessageShowArea.hpp"
#include "../subassembly/MessageEditArea/MessageEditArea.hpp"
#include "../subassembly/SessionDetailWidget/SessionDetailWidget.hpp"

namespace chat_system::window {
// >>> class WindowRight begin >>>
class WindowRight : public QWidget {
private:
    QLabel* backgroundLogoLabel_; // 背景 logo
    QWidget* titleWidget_; // 会话标题窗口组件
    QLabel* sessionTitle_; // 会话标题标签组件
    QPushButton* extraBtn_; // 更多按钮组件
    subassembly::MessageShowArea* messageShowArea_; // 消息显示区域
    subassembly::MessageEditArea* messageEditArea_; // 消息编辑区域

public:
    // 构造方法
    explicit WindowRight(QWidget* parent = nullptr)
    : QWidget(parent)
    , backgroundLogoLabel_(new QLabel(this))
    , titleWidget_(new QWidget(this))
    , sessionTitle_(new QLabel(titleWidget_))
    , extraBtn_(new QPushButton(titleWidget_))
    , messageShowArea_(new subassembly::MessageShowArea(this))
    , messageEditArea_(new subassembly::MessageEditArea(this)) {
        this->setElement();
        this->setElementStaticData();
        this->setElementSize();
        this->setElementStyle();
        this->setElementLayout();
        this->setElementSignalSlot();
        this->setElementShow();
    }

    // 析构方法
    ~WindowRight() override = default;

    // 设置标题文本
    void setTitleText(const QString& text) {
        sessionTitle_->setText(text); // 考虑去除这个函数
    }

    // 设置组件隐藏
    void switchShow(const bool& hide) {
        if (hide) {
            backgroundLogoLabel_->show();
            titleWidget_->hide();
            sessionTitle_->hide();
            extraBtn_->hide();
            messageShowArea_->hide();
            messageEditArea_->hide();
        }
        else {
            backgroundLogoLabel_->hide();
            titleWidget_->show();
            sessionTitle_->show();
            extraBtn_->show();
            messageShowArea_->show();
            messageEditArea_->show();
        }
    }

    // 获取消息显示区域
    subassembly::MessageShowArea* getMessageShowArea() {
        return messageShowArea_;
    }

protected:
    void resizeEvent(QResizeEvent* event) {
        QWidget::resizeEvent(event);
        QPixmap pixmap(":/window/window_main/background_logo.png");
        int logoX = (this->width() - pixmap.width()) / 2; // 设置背景logo的位置为中心对齐
        int logoY = (this->height() - pixmap.height()) / 2;
        backgroundLogoLabel_->setGeometry(logoX, logoY, pixmap.width(), pixmap.height());
    }

private:
    // 设置组件方法
    void setElement() {}

    // 设置组件数据方法
    void setElementStaticData() {
        this->setTitleText("标题");

        titleWidget_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
        titleWidget_->setObjectName("titleWidget_"); // TODO: 后续都改为这种 id 的形式

        auto extraBtnIcon = QIcon(":/window/window_right/extra.png");
        if (extraBtnIcon.isNull()) { common::Tools::getInstance()->getLogger()->error("extraBtnIcon is null"); }
        extraBtn_->setIcon(extraBtnIcon);

        // 初始状态下只显示背景 logo
        QPixmap pixmap(":/window/window_main/background_logo.png");
        int logoX = (this->width() - pixmap.width()) / 2; // 设置背景 logo 的位置为中心对齐
        int logoY = (this->height() - pixmap.height()) / 2;
        backgroundLogoLabel_->setScaledContents(false); // 不允许缩放
        backgroundLogoLabel_->setAttribute(Qt::WA_TranslucentBackground); // 背景透明
        backgroundLogoLabel_->setPixmap(pixmap);
        backgroundLogoLabel_->setGeometry(logoX, logoY, pixmap.width(), pixmap.height());
    }

    // 设置组件尺寸方法
    void setElementSize() {
        this->setMinimumWidth(420);
        this->setMinimumHeight(500);

        titleWidget_->setFixedHeight(61);

        extraBtn_->setFixedSize(30, 30);
    }

    // 设置组件风格方法
    void setElementStyle() {
        QString btnStyle =
                "QPushButton {"
                "background-color: rgb(245, 245, 245);"
                "border: none;"
                "}"
                "QPushButton:pressed {"
                "background-color: rgb(255, 255, 255);"
                "border: none;"
                "}";

        this->setStyleSheet("QWidget { background-color: rgb(245, 245, 245); border: 1px solid rgb(10, 11, 11); }");

        titleWidget_->setStyleSheet("#titleWidget_ { border: none; border-bottom: 1px solid rgb(220, 220, 220); background-color: transparent; }");

        sessionTitle_->setStyleSheet("QLabel { border: none; background-color: transparent; color: black; font-size: 20px; }");

        extraBtn_->setStyleSheet(btnStyle);
    }

    // 设置组件布局方法
    void setElementLayout() {
        // 设置布局管理
        auto vlayout = new QVBoxLayout();

        vlayout->setSpacing(0);
        vlayout->setContentsMargins(0, 0, 0, 0);
        vlayout->setAlignment(Qt::AlignTop);

        vlayout->addWidget(titleWidget_);

        this->setLayout(vlayout);

        // 设置标题的布局管理器
        auto hlayout = new QHBoxLayout();

        hlayout->setSpacing(0);
        hlayout->setContentsMargins(15, 0, 10, 0);
        hlayout->addWidget(sessionTitle_);
        hlayout->addWidget(extraBtn_);

        // 设置聊天气泡区域
        vlayout->addWidget(messageShowArea_);

        // 设置文本编辑区域
        vlayout->addWidget(messageEditArea_, 0, Qt::AlignBottom); // 保证在下面(设置拉伸因子和对齐标准)

        titleWidget_->setLayout(hlayout);
    }

    // 设置组件信号槽方法
    void setElementSignalSlot() {
        connect(extraBtn_, &QPushButton::clicked, this, [=](){
            qDebug() << QString("%1 %2 extraBtn clicked").arg(__FILE__).arg(__LINE__);

            // 读取数据
            QIcon icon(":/test/limou.png");
            if (icon.isNull()) { common::Tools::getInstance()->getLogger()->error("icon is null"); }
            auto user = model::UserModel::makeUser(
                    "limou",
                    "13533330000",
                    "优雅永不过时",
                    icon,
                    "1"
            );

            bool isDoubleChat = false; // TODO: 要根据用户选择修改 isDoubleChat 的值

            // 当双人会话时
            if (isDoubleChat) {
                auto sessionDetailWidget = new subassembly::DoubleChatSessionDetailWidget(user);
                sessionDetailWidget->show(); // TODO: 这个可能还需要进一步设置为弹窗, 其实我不太想做成弹窗的...
            }
            // 当多人会话时
            else { // !isDoubleChat
                auto sessionDetailWidget = new subassembly::GroupChatSessionDetailWidget(user);
                sessionDetailWidget->show(); // TODO: 这个可能还需要进一步设置为弹窗, 其实我不太想做成弹窗的...
            }
        });
    }

    // 设置组件显示方法
    void setElementShow() {
        // 切换隐藏其他组件
        this->switchShow(true);
    };
};
// <<< class WindowRight end <<<
} // class chat_system::window end

#endif //FRONTEND_WINDOWRIGHT_HPP
